/*
 题目：
 将一个长度为n的数组循环左移p位，输出结果。
 例如，将数组{0, 1, 2, 3, 4, 5, 6}循环左移2位，结果为{2, 3, 4, 5, 6, 0, 1}。

 思路：
 将数组前p个元素逆序，再将后n-p个元素逆序，最后将整个数组逆序。

 补充：
 如果是循环右移p位，则等价于循环左移n-p位。
*/

#include <iostream>
using namespace std;

int main()
{
    // variables
	int arr[] = {0, 1, 2, 3, 4, 5, 6};
	int n = sizeof(arr) / sizeof(int);
	int p = 2;

    // 1. reverse the first p elements
	for (int i = 0; i < p/2; ++i)
	{
	    int temp = arr[i];
	    arr[i] = arr[p-1-i];
	    arr[p-1-i] = temp;
	}

    // 2. reverse the last n-p elements
	for (int i = p; i < p+(n-p)/2; ++i)
	{
	    int temp = arr[i];
	    arr[i] = arr[n-1-(i-p)];
	    arr[n-1-(i-p)] = temp;
	}

    // 3. reverse the whole array
	for (int i = 0; i < n/2; ++i)
	{
	    int temp = arr[i];
	    arr[i] = arr[n-1-i];
	    arr[n-1-i] = temp;
	}

    // print the result
    for (int i = 0; i < n; ++i)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
	return 0;
}